<?php /** 提交试卷 api **/
require_once '../../config/req.conf.php';
require_once '../../utils/CommonMethods.php';
require_once '../../utils/VerifyFormData.php';
require_once '../../utils/DBUtils.php';
require_once '../../utils/CommonFun.php';

/* 1. token认证和角色权限校验 */
$headers = apache_request_headers(); // 请求头信息获取
$info = VerifyFormData::verifyRole($headers['Authorization'], "examinee");
if( CommonMethods::isEmpty($info) ){
    RespJson::fail("没有访问权限");
    return;
}

/* 2. 处理表单数据 */
if( !VerifyFormData::submitPaperDataVerify($_POST) ) return;

/* 3. 判断提交的题目是否存在 */
DBUtils::init();
$questions = array();
foreach ($_POST['answer'] as $questionId => $change){
    $question = DBUtils::queryOne( // 查询单题的答案
        DBUtils::getSql("php_questions")
            ->filter("answer")
            ->where("id = {$questionId}")
            ->select()
    );
    if( CommonMethods::isEmpty($question) ){
        RespJson::fail("存在提交不存在的题目, 请重试");
        return;
    }
    $questions[$questionId] = $question; // 缓存起来
}

/* 4. 判断此时是异步存储答案还是提交试卷 -> 就是不管是干嘛, 都先进行答案的存储, 如果是提交答案, 那么才进行等级的判断 */
$success = DBUtils::execute( // 那么就是修改数据库中的答案信息
    DBUtils::getSql("php_user_paper")
        ->set("answerJson = '{$_POST['answer_json']}'")
        ->where("uId = {$info['id']} and pId = {$_POST['id']}")
        ->update()
);
if( $success ){
    /* 接下来如果选择提交, 那么就进行等级的计算 */
    if( $_POST['submit'] ){ // 此时为提交试卷
        // 要进行试卷的批改
        $questionTotal = count($_POST['answer']); // 获取该试卷的题目数量
        $correctCount = 0; // 正确题数
        foreach ($_POST['answer'] as $questionId => $change){
            if( $questions[$questionId]['answer'] === $change )
                $correctCount++;
        }
        // 进行等级的计算
        $score = $correctCount / $questionTotal;
        $rank = getRank($score);
        // 进行数据库的存储
        $success = DBUtils::execute(
            DBUtils::getSql("php_user_paper")
                ->set("rank = '{$rank}'")
                ->where("uId = {$info['id']} and pId = {$_POST['id']}")
                ->update()
        );
        if( $success ){
            /* 通过判断等级来修改用户的通过与否 */
            if( $rank !== '不及格' ){
                DBUtils::execute(
                    DBUtils::getSql("php_user")
                        ->set("isPass = 1")
                        ->where("id = {$info['id']}")
                        ->update()
                );
            }
            RespJson::success();
        }else{
            RespJson::fail("等级评定失败");
        }
    }else{
        RespJson::success();
    }
}else{
    RespJson::fail("保存答案失败");
}